/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package GUIaVykreslovanie;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.AbstractTableModel;
import Sablony.*;
import java.util.Calendar;
import java.util.Date;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.DefaultTableModel;



/**
 *  Trieda, ktorá zaisťuje používateľské rozhranie na prácu so šablónami klientov
 * @author MartinaHlinková
 */
public class MiniGUIKlienti extends JFrame  {
   final private Sablony.SablonaKlientov sablonaKlientovMini;
   private JTable tabulka;
   private boolean novaSablona;
   private Sablony.Klient aktivnyKlient ;
    /**
     * konštanta maximálneho počtu znakov, ktoré množno vložiť do textových vstupov
     */
    final static int MAX_DLZKA_VSTUPU = 64;
    /**
     * Konštruktor triedy MiniGUIKlienti, ktorý vytvára novú prázdnu šablónu klientov
     * a zobrazuje ju v editore
     * 
     * @param menoSablony názov novej šablóny klientov
     */
    public MiniGUIKlienti(String menoSablony){
        sablonaKlientovMini = new Sablony.SablonaKlientov(menoSablony);
        this.novaSablona = true;
        this.aktivnyKlient = null;
         try{

            initMetoda();
            this.setVisible(true); // okno zviditelnit
	    this.toFront(); // okno dat do popredia
        }
        catch(Exception e){
            e.printStackTrace();
        }
    }
    /**
     * Konštruktor triedy MiniGUIKlienti, ktorý zobrazuje už existujúcu šablónu
     * klientov
     * 
     * @param menoSablony   meno zobrazovanej šablóny
     * @param sablona zobrazovaná šablóna
     */
    public MiniGUIKlienti(String menoSablony, Sablony.SablonaKlientov sablona){
        sablonaKlientovMini = sablona;
        this.novaSablona = false;
        this.aktivnyKlient = null;
        
        try{

            initMetoda();
            this.setVisible(true); // okno zviditelnit
	    this.toFront(); // okno dat do popredia
        }
        catch(Exception e){
            e.printStackTrace();
        }
    }
    /**
     * Metóda zobrazujúca a obsluhujúca prvky Minieditoru klientov 
     */
    private void initMetoda(){
        final int OKNO_CAST = 40; // percento z celej plochy obrazovky
        Toolkit t = Toolkit.getDefaultToolkit();
	Dimension d = t.getScreenSize();
		
        this.setLocation(d.width * (100 - OKNO_CAST) / 100 / 2, d.height
				* (100 - OKNO_CAST) / 100 / 2); // zadanie laveho horneho horu
        this.setSize(d.width * OKNO_CAST / 100, d.height * OKNO_CAST / 100); 
        this.setResizable(false); // je mozne menit velkost okna
	this.setTitle("Luba - Editor šablony klientov"); // titulok
        this.setModalExclusionType(Dialog.ModalExclusionType.APPLICATION_EXCLUDE);
																		// okna
        // ukoncenie cez udalost WindowEvent
        this.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        this.setLayout(new BorderLayout(2, 2));
        
       
	JPanel lista = new JPanel(new FlowLayout(FlowLayout.LEFT));
        JScrollPane scrollPane = new JScrollPane();
        JButton buttonNovyKlient = new JButton("Nový klient");
        JButton buttonZmazKlienta = new JButton("Zmaž klienta");
        JButton buttonUlozSablonu = new JButton("Ulož");
        JButton buttonPritomnosti = new JButton("Pobyt");
        JButton buttonOdid = new JButton("Odíď");
	
	lista.setBackground(Color.LIGHT_GRAY);
	this.add(BorderLayout.NORTH, lista);
	this.add(BorderLayout.SOUTH,scrollPane);
        
        
        
        lista.add(buttonNovyKlient ); 
        lista.add(buttonZmazKlienta);
        lista.add(buttonUlozSablonu ); 
        lista.add(buttonPritomnosti ); 
        lista.add(buttonOdid ); 
        
        
        tabulka = new JTable();
        tabulka.setModel(new DefaultTableModel(
                new Object[][]{},
                new String[]{"ID","Identifikačné meno"}
                ){
                    Class[] types = new Class[]{String.class,String.class};
            @Override
                    public Class getColumnClass(int columnIndex){
                        return types[columnIndex];
                    }
                });
        
        for(Sablony.Klient klientVSablone: this.sablonaKlientovMini.getKlientiVSablone()){
             DefaultTableModel model =(DefaultTableModel) tabulka.getModel();
             model.addRow(new Object[]{klientVSablone.getIDKlienta(),klientVSablone.getMenoKlienta()});
        }

        scrollPane.setViewportView(tabulka);
        ListSelectionModel selectionModel = tabulka.getSelectionModel();  
        selectionModel.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);  
 
       
        
       pack();
       tabulka.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent event){
                if ( SwingUtilities.isLeftMouseButton(event) )
		{
			Point p = event.getPoint();
			int rowNumber = tabulka.rowAtPoint( p );
                        ListSelectionModel model = tabulka.getSelectionModel();
			model.setSelectionInterval( rowNumber, rowNumber );
                        int idKlientaRow = Integer.parseInt(tabulka.getValueAt(rowNumber, 0).toString());
                        aktivnyKlient = sablonaKlientovMini.najdiKlientaPodlaID(idKlientaRow);
                        
		}
            }
       }
               
       );
       
       
      
        buttonNovyKlient.addActionListener(new ActionListener() { // anonym. vnut. trieda pre udalost
			public void actionPerformed(ActionEvent e) {
                                akcia_pridanieKlientaDoTabulky();
			}
		});
        
        buttonZmazKlienta.addActionListener(new ActionListener() { // anonym. vnut. trieda pre udalost
			public void actionPerformed(ActionEvent e) {
                              if(aktivnyKlient != null) akcia_zmazOznacenehoKlienta();
			}
		});
        
        buttonUlozSablonu.addActionListener(new ActionListener() { // anonym. vnut. trieda pre udalost
			public void actionPerformed(ActionEvent e) {
                                    akcia_zapisSablonyDoXML();
			}
		});
        buttonPritomnosti.addActionListener(new ActionListener() { // anonym. vnut. trieda pre udalost
			public void actionPerformed(ActionEvent e) {
                                if(aktivnyKlient != null){
                                    akcia_zobrazPritomnostiKlienta();
                                }else{
                                    JOptionPane.showMessageDialog(null,"Nie je označený žiaden klient z tabuľky.");
                                }
			}
		});
        buttonOdid.addActionListener(new ActionListener() { // anonym. vnut. trieda pre udalost
			public void actionPerformed(ActionEvent e) {
                                akcia_ukonciMiniGUI();
			}
		});
    }
    /**
       * Metóda, ktorá ukončuje činnosť minieditora klientov
       */
    private void akcia_ukonciMiniGUI(){
        this.disable();
        this.dispose();
    }
    /**
     * Metóda, ktorá pridá klienta do šablóny klientov
     */
    private void akcia_pridanieKlientaDoTabulky(){
        Sablony.Klient novy = akcia_napln_noveho_klienta();
                                if(novy == null){
                                    JOptionPane.showMessageDialog(null,"Klient nebol pridaný.");
                                }else if(sablonaKlientovMini.pridajKlienta(novy) == false){
                                    JOptionPane.showMessageDialog(null,"Klient s takýmto identifikačným číslom už existuje alebo nebol správne vyplnený.");
                                }else{
                                     DefaultTableModel model =(DefaultTableModel) tabulka.getModel();
                                     model.addRow(new Object[]{novy.getIDKlienta(),novy.getMenoKlienta()});
                                }  
    }
    /**
     * metóda, ktorá zmaže označeného klienta v tabuľke zo šablóny 
     */
   private void akcia_zmazOznacenehoKlienta(){
       DefaultTableModel model =(DefaultTableModel) tabulka.getModel();
            if(model.getRowCount() > 0){
                for(int i = (model.getRowCount()- 1); i >= 0; i--){
                    String hladanyKlient=tabulka.getValueAt(i, 0).toString();
                    if(hladanyKlient.equals(""+this.aktivnyKlient.getIDKlienta())){
                        model.removeRow(i);
                        this.sablonaKlientovMini.odoberKlienta(aktivnyKlient);
                        aktivnyKlient =null;
                    }
                }
            }
       
   }
    /**
       * Metóda, zapisujúca šablónu klientov do trvalej pamäti
       */
   private void akcia_zapisSablonyDoXML(){
       if(this.novaSablona == true){
            this.sablonaKlientovMini.novaXMLSablona();
       }else{
           this.sablonaKlientovMini.novaXMLSablona();
       }
    }
   /**
    * metóda, ktorá zobrazí dialógové okno s blokmi prítomnosti klienta označeného v tabuľke
    */
   private void akcia_zobrazPritomnostiKlienta(){
       DialogPritomnostiKlienta dialogPritomnosti;
       
       dialogPritomnosti = new DialogPritomnostiKlienta(this,this.aktivnyKlient);
       dialogPritomnosti.show();
   }
  
   
   /**
    * Metóda, ktorá používateľovi umožní vytvoriť nového klienta a nastaviť jeho vlastnosti
    * @return nový klient, objekt triedy Klient
    */
    private Sablony.Klient akcia_napln_noveho_klienta(){
        int noveID =0;
        String noveMeno = "";
        String neskontrolovaneID,neskontrolovaneMeno;
        DialogNovehoKlienta dialog;
        
        try{
        dialog = new DialogNovehoKlienta(this);
        dialog.show();
        neskontrolovaneID = dialog.getID();
        neskontrolovaneMeno = dialog.getMeno();
        
        if(neskontrolovaneID == null || neskontrolovaneMeno == null){
            return null;
        }
                
         noveID = Integer.parseInt(neskontrolovaneID);
         noveMeno = neskontrolovaneMeno;
         
        }
        catch(NumberFormatException ex){
            JOptionPane.showMessageDialog(this,"Zadali ste nespravny tvar ID.");
		this.repaint();
        }
        catch(Exception ex){
            ex.printStackTrace();
        }
        Sablony.Klient novyKlient = new Sablony.Klient(noveID,noveMeno);
         return novyKlient;
    }
    /**
     * Metóda, ktorá umožní používateľovi vytvoriť novú prítomnosť klienta a nastaviť
     * jej vlastnosti
     * @return nová prítomnosť klienta, objekt triedy PritomnostKlietov
     */
    private Sablony.PritomnostKlientov akcia_napln_novu_pritomnost(){
            Date casOd,casDo;
            Sablony.StavKlienta stav;
            DialogNovejPritomnosti dialog;
            Sablony.PritomnostKlientov navrat = null;
            try{
            dialog = new DialogNovejPritomnosti(this);
            dialog.show();
            
            //datum od
            casOd = dialog.getDatumOd();
            //datum do
            casDo = dialog.getDatumDo();
            //stav klienta
            String stavString = null;
            if(dialog.stav == null){stav =null;}
                else {stavString = dialog.stav.getSelectedItem();}
            if(stavString == null)stav=null;
            else if(stavString.contains("Ľahký")){
                stav = StavKlienta.LAHKY;
            }else if(stavString.contains("Ťažký")){
                stav = StavKlienta.TAZKY;
            }else{
                stav = null;
            }
            
            if(stav == null || casOd == null || casDo == null){
                return null;
            }else{
                navrat = new Sablony.PritomnostKlientov(casOd, casDo, stav);
            }
        }
             catch(NumberFormatException ex){
            JOptionPane.showMessageDialog(this,"Zadali ste nesprávny tvar ID.");
		this.repaint();
        }
        catch(Exception ex){
            ex.printStackTrace();
        }
            return navrat;
    }
    /**
        * Vnútorná trieda triedy MiniGUIKlienti ako dialógové okno, v ktorom používateľ môže
        * prehialať bloky prítomnosti konkrétneho klienta, vkladať nové bloky alebo vymazávať
        */
    private class DialogPritomnostiKlienta extends Dialog implements ActionListener {
        private Sablony.Klient klientPritomnosti;
        private JTable tabulka;
        private Sablony.PritomnostKlientov aktivnaPritomnost;
        /**
             * Konštruktor vnútornej triedy. Vykresluje a obsluhuje prvky dialógového okna
             * @param vlastnik rodičovské okno, z ktorého voláme objekt tejto triedy
             */
        DialogPritomnostiKlienta(JFrame vlastnik,Sablony.Klient klient){
            super(vlastnik,"Dialog pobytu klienta"+ klient.getMenoKlienta(),true);
            this.klientPritomnosti = klient;
            this.setLayout(new BorderLayout(2, 2));
            this.setSize(500,500);
            this.setModal(true);
            
            JPanel lista = new JPanel(new FlowLayout(FlowLayout.LEFT));
            JScrollPane scrollPane = new JScrollPane();
            JButton buttonNovaPritomnost = new JButton("Nový pobyt");
            JButton buttonVymazPritomnost = new JButton("Vymaž pobyt");
            JButton buttonOdid = new JButton("Odíď");
            
            this.add(BorderLayout.NORTH,lista);
            this.add(BorderLayout.SOUTH,scrollPane);
            lista.add(buttonNovaPritomnost);
            lista.add(buttonVymazPritomnost);
            lista.add(buttonOdid);
            tabulka = new JTable();
            tabulka.setModel(new DefaultTableModel(
                new Object[][]{},
                new String[]{"Čas od","Čas do","Stav klienta"}
                ){
                    Class[] types = new Class[]{String.class,String.class,String.class};
            @Override
                    public Class getColumnClass(int columnIndex){
                        return types[columnIndex];
                    }
                });
            
            DefaultTableModel model =(DefaultTableModel) tabulka.getModel();
            for(Sablony.PritomnostKlientov iterator: klient.getPritomnostKlienta()){
                 model.addRow(new Object[]{iterator.getPociatocnyCas(),iterator.getKonecnyCas(),iterator.getStavKlienta()});
            }
            scrollPane.setViewportView(tabulka);
            ListSelectionModel selectionModel = tabulka.getSelectionModel();  
            selectionModel.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
            
            tabulka.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent event){
                if ( SwingUtilities.isLeftMouseButton(event) )
		{
			Point p = event.getPoint();
			int rowNumber = tabulka.rowAtPoint( p );
                        ListSelectionModel model = tabulka.getSelectionModel();
			model.setSelectionInterval( rowNumber, rowNumber );
                        
                        String hladanyCas=tabulka.getValueAt(rowNumber, 0).toString();
                        aktivnaPritomnost =klientPritomnosti.najdiPritomnostPodlaPociatocnehoCasu(hladanyCas);
		}
            }
       });
            
            buttonNovaPritomnost.addActionListener(new ActionListener() { // anonym. vnut. trieda pre udalost
			public void actionPerformed(ActionEvent e) {
                                akcia_pridajNovuPritomnostDoTabulky();
			}
		});
            
            buttonVymazPritomnost.addActionListener(new ActionListener() { // anonym. vnut. trieda pre udalost
			public void actionPerformed(ActionEvent e) {
                               if(aktivnaPritomnost != null){
                                    akcia_zmazOznacenuPritomnost();
                                }
			}
		});
            buttonOdid.addActionListener(this);
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            this.dispose();
        }
        /**
         * Metóda, ktorá pridá novú prítomnosť do šablóny klientov
         */
        private void  akcia_pridajNovuPritomnostDoTabulky(){
       Sablony.PritomnostKlientov novy = akcia_napln_novu_pritomnost(); 
       if(novy == null){
            JOptionPane.showMessageDialog(this,"Nesprávne vyplnenie pobytu.");
       }else if(this.klientPritomnosti.pridajPritomnost(novy) == false){
            JOptionPane.showMessageDialog(this,"Takýto pobyt už existuje alebo časy pobytu sa prekrývajú.");
       }else{
          DefaultTableModel model =(DefaultTableModel) tabulka.getModel();
          model.addRow(new Object[]{novy.getPociatocnyCas(),novy.getKonecnyCas(),novy.getStavKlienta()});
       }
   }
        /**
         * Metóda, ktorá zmaže vybranú prítomnosť zo šablóny klientov
         */
        private void akcia_zmazOznacenuPritomnost(){
            
            DefaultTableModel model =(DefaultTableModel) tabulka.getModel();
           
            if(model.getRowCount() > 0){
                for(int i = (model.getRowCount()- 1); i >= 0; i--){
                    
                    String hladanyCas=tabulka.getValueAt(i, 0).toString();
                    
                    if(hladanyCas.equals(this.aktivnaPritomnost.getPociatocnyCas().toString())){
                        model.removeRow(i);
                        
                        this.klientPritomnosti.odoberPritomnost(aktivnaPritomnost);
                        this.aktivnaPritomnost = null;
                    }
                }
            }
        }
        
        
    } //koniec triedy DialogPritomnostiKlienta
    /**
       * Vnútorná trieda triedy MiniGUIKlienti ako dialógové okno, v ktorom používateľ 
       * môže vytvoriť nového klienta a nastaviť mu požadované vlastnosti
       */
    private class DialogNovehoKlienta extends Dialog implements ActionListener{
        TextField fieldID, fieldMeno;
        /**
         * Konštruktor vnútornej triedy. Vykresluje a obsluhuje prvky dialógového okna
         * @param vlastnik rodičovské okno, z ktorého voláme objekt tejto triedy
         */
        DialogNovehoKlienta(JFrame vlastnik){
            super(vlastnik, "Dialog nového klienta", true);
            this.setLayout(new GridLayout(3,2,5,5));
            this.setSize(500,120);
            this.setModal(true);
            fieldID = new TextField(5);
            fieldMeno = new TextField(50);
            JLabel popisID = new JLabel("Id klienta - číslo od 10 do 99");
            JLabel popisMeno = new JLabel("Meno klienta");
            JButton buttonPotvrd = new JButton("Potvrď");
            JButton buttonOdid = new JButton("Odíď");
              
            buttonPotvrd.addActionListener(this);
            buttonOdid.addActionListener(new ActionListener(){

                @Override
                public void actionPerformed(ActionEvent e) {
                    fieldID = null;
                    fieldMeno = null;
                    dispose();
                }
            });
            this.add(popisID);
            this.add(fieldID);
            this.add(popisMeno);
            this.add(fieldMeno);
            this.add(buttonPotvrd);
            this.add(buttonOdid);
       
        }
        /**
         * Metóda vracajúca text textového poľa s identifikačným číslom
         * @return textový reťazec, v ktorom by malo byť identifikačné číslo
         */
        public String getID(){
            return fieldID.getText();
        }
        /**
         *  Metóda vracajúca text textového poľa s identifikačným menom klienta
         * @return textové pole s identifikačným menom klienta
         */
        public String getMeno(){
            return fieldMeno.getText();
        }  
        @Override
        public void actionPerformed(ActionEvent e) {
            boolean ok = true;
            try{
         int noveID = Integer.parseInt(fieldID.getText());
         if(noveID > 99 || noveID < 10){
            JOptionPane.showMessageDialog(this,"Zadali ste nesprávny tvar čísla.");
            ok = false;
         } 
         
         if(ok == true &&(fieldMeno == null || fieldMeno.getText().equals(""))){
             JOptionPane.showMessageDialog(this,"Nezadali ste meno.");
             ok = false;
         }
         
         if(ok == true &&(fieldMeno.getText().contains("\\") ||fieldMeno.getText().contains("/") ||fieldMeno.getText().contains(".") || fieldMeno.getText().contains("%") )){
                    JOptionPane.showMessageDialog(this,"Meno obsahuje nepovolené znaky(. / % \\)");
                    ok = false;
                }
         }catch (Exception ex){
            ex.printStackTrace();
         }
         if(ok == true){
             this.dispose();
         }   
        }
    }
    /**
       * Vnútorná trieda triedy MiniGUIKlienti ako dialógové okno, v ktorom používateľ môže vytvoriť
       * novú prítomnosť klienta a nastaviť jej požadované vlastnosti
       */
    private class DialogNovejPritomnosti extends Dialog implements ActionListener{
         TextField fieldRokOd, fieldRokDo,casOd,casDo;
         Choice mesiacOd,mesiacDo,denOd,denDo,stav;
         DialogNovejPritomnosti(JFrame vlastnik){
            super(vlastnik, "Dialog nového pobytu", true);
            this.setLayout(new GridLayout(4,5,5,5));
            this.setSize(500,200);
            this.setModal(true);
            
            //prvy riadok gridlayout
            this.add(new JLabel(""));
            this.add(new JLabel("ROK"));
            this.add(new JLabel("MESIAC"));
            this.add(new JLabel("DEŇ"));
            this.add(new JLabel("ČAS"));
            
            //druhy riadok
            fieldRokOd = new TextField(4);
            mesiacOd = new Choice();
            final InformacnaStruktura.Mesiac[] mesiace = InformacnaStruktura.Mesiac.values();
            for(InformacnaStruktura.Mesiac iterator: mesiace){
                mesiacOd.addItem(iterator.toString());

            }
            denOd = new Choice();
            casOd = new TextField(5);
            
            this.add(new JLabel("DÁTUM A ČAS ODKEDY"));
            this.add(fieldRokOd);
            this.add(mesiacOd);
            this.add(denOd);
            this.add(casOd);
            
            mesiacOd.addItemListener(new ItemListener() {

                public void itemStateChanged(ItemEvent e) {
                    String vyber = mesiacOd.getSelectedItem();
                    for(InformacnaStruktura.Mesiac iterator: mesiace){
                        if(vyber.equals(iterator.toString())){
                            for(int i = 1; i<= iterator.getPocetDni();i++){
                                denOd.addItem(""+i);
                            }
                            if(vyber.equals(InformacnaStruktura.Mesiac.FEBRUAR.toString())){
                                String rok = fieldRokOd.getText();
                                int rokInt = Integer.parseInt(rok);
                                if(rokInt%4 == 0){
                                    denOd.addItem("29");
                                }
                            }
                        }
                    }
                }
            });
            
            //treti riadok
            
            fieldRokDo = new TextField(4);
            mesiacDo = new Choice();
            for(InformacnaStruktura.Mesiac iterator: mesiace){
                mesiacDo.add(iterator.toString());
            }
            denDo = new Choice();
            casDo = new TextField(5);
            
            this.add(new JLabel("DÁTUM A ČAS DOKEDY"));
            this.add(fieldRokDo);
            this.add(mesiacDo);
            this.add(denDo);
            this.add(casDo);
            
            mesiacDo.addItemListener(new ItemListener() {

                public void itemStateChanged(ItemEvent e) {
                    String vyber = mesiacDo.getSelectedItem();
                    for(InformacnaStruktura.Mesiac iterator: mesiace){
                        if(vyber.equals(iterator.toString())){
                            for(int i = 1; i<= iterator.getPocetDni();i++){
                                denDo.addItem(""+i);
                            }
                            if(vyber.equals(InformacnaStruktura.Mesiac.FEBRUAR.toString())){
                                String rok = fieldRokDo.getText();
                                int rokInt = Integer.parseInt(rok);
                                if(rokInt%4 == 0){
                                    denDo.addItem("29");
                                }
                            }
                        }
                    }
                }
            });
            
            //stvrty riadok
            
            stav = new Choice();
            stav.add("Ľahký");
            stav.add("Ťažký");
            JButton buttonPotvrd = new JButton("Potvrď");
            JButton buttonOdid = new JButton("Odíď");
            
            this.add(new JLabel("STAV KLIENTA"));
            this.add(stav);
            this.add(buttonPotvrd);
            this.add(buttonOdid);
            
            buttonPotvrd.addActionListener(this);
            
            buttonOdid.addActionListener(new ActionListener() { 
			public void actionPerformed(ActionEvent e) {
                                fieldRokOd = null;
                                fieldRokDo = null;
                                casOd = null;
                                casDo = null;
                                mesiacOd = null;
                                mesiacDo = null;
                                denOd = null;
                                denDo = null;
                                stav = null;
                                dispose();
			}
		});
            
         }
         
        @Override
        public void actionPerformed(ActionEvent e) {
            boolean ok = true;
            if(this.getDatumOd() == null){
                JOptionPane.showMessageDialog(this,"Nesprávne zadaný čas odkedy.");
                ok = false;
            }
            if(ok == true && this.getDatumDo() == null){
                JOptionPane.showMessageDialog(this,"Nesprávne zadaný čas dokedy.");
                ok = false;
            }
            if(ok == true && this.getDatumDo().before(this.getDatumOd())){
                JOptionPane.showMessageDialog(this,"Čas dokedy je pred časom odkedy.");
                ok = false;
            }
            String stavString = stav.getSelectedItem();
            if(ok == true && (stavString == null || stavString.isEmpty())){
                JOptionPane.showMessageDialog(this,"Nezadaný stav klienta.");
                ok = false;
            }
            if(ok == true){
                this.dispose();
            }
      
        }   
        /**
         * Metóda, ktorá vracia dátum odkedy trvá prítomnosť klienta
         * @return dátum odkedy trvá prítomnosť klienta, objekt triedy Date
         */
        public Date getDatumOd(){
            if(this.fieldRokOd == null || this.mesiacOd == null || this.denOd == null || this.casOd == null){
                return null;
            }
            String rok="",mesiac="",den="",cas="";
             rok = this.fieldRokOd.getText();
            mesiac = this.mesiacOd.getSelectedItem();
            den = this.denOd.getSelectedItem();
            cas = this.casOd.getText();
            if(rok == null || mesiac==null ||den == null || cas == null)return null;
            if(rok.isEmpty() || mesiac.isEmpty() || den.isEmpty() || cas.isEmpty())return null;
            Date datumOd = ziskajDateZoStringov(rok,mesiac,den,cas);
            return datumOd;
            
        }
        /**
         * Metóda, ktorá vracia dátum dokedy trvá prítomnosť klienta
         * @return dátum dokedy trvá prítomnosť klienta, objekt triedy Date
         */
        public Date getDatumDo(){
            if(this.fieldRokDo == null || this.mesiacDo == null || this.denDo == null || this.casDo == null){
                return null;
            }
            String rok="",mesiac="",den="",cas="";
            rok = this.fieldRokDo.getText();
            mesiac = this.mesiacDo.getSelectedItem();
            den = this.denDo.getSelectedItem();
            cas = this.casDo.getText();
            if(rok == null || mesiac==null ||den == null || cas == null)return null;
            if(rok.isEmpty() || mesiac.isEmpty() || den.isEmpty() || cas.isEmpty())return null;
            Date datumDo = ziskajDateZoStringov(rok,mesiac,den,cas);
            return datumDo;
        }
         
       

}
    /**
     * Metóda, ktorá z textových reťazcov vytvára objekt triedy Date, teda dátum
     * @param rok   textový reťazec s rokom
     * @param mesiac    textový reťazec s mesiacom
     * @param den   textový reťazec s dňom
     * @param cas   textový reťazec s casom
     * @return  pri strávnom vytvrení objektu typu Date dátum, inak null
     */
    public static Date ziskajDateZoStringov(String rok, String mesiac, String den, String cas){
        Date navrat;
        navrat=null;
            if(rok == null || rok.isEmpty() || rok.length() != 4){
                return null;
            }
            if(mesiac == null || mesiac.isEmpty()){
                return null;
            }
            if(den == null || den.isEmpty() || den.length() > 2){
                return null;
            }
            if(cas == null || cas.isEmpty() || cas.length() < 3 || cas.length() >5 || !cas.contains(":")){
                return null;
            }
            try{
                int rokInt = Integer.parseInt(rok);
                int mesiacInt = -1;
                int denInt = Integer.parseInt(den);
                int hodinaInt ;
                int minutaInt;
                InformacnaStruktura.Mesiac testMesiac =null;
                
                if(rokInt < 1900)return null;
                
                InformacnaStruktura.Mesiac mesiace[] = InformacnaStruktura.Mesiac.values();
                for(InformacnaStruktura.Mesiac iterator:mesiace){
                    if(mesiac.equals(iterator.toString()) == true){
                       mesiacInt = iterator.getPoradieMesiaca();
                       testMesiac = iterator;
                    }
                }
                if(mesiacInt < 0 || mesiacInt > 11) return null;
                
                if( denInt < 1 || (denInt > testMesiac.getPocetDni() && !(testMesiac == InformacnaStruktura.Mesiac.FEBRUAR && (rokInt%4 == 0) && denInt == 29 ))){
                    return null;
                }
               //skontrolovanie formatu casu
                
                
                if(Character.isDigit(cas.charAt(0)) == false){
                    return null;
                }
                
                if(Character.isDigit(cas.charAt(1)) == false && Character.compare(':',cas.charAt(1)) != 0){
                    return null;
                }
                
                if(Character.isDigit(cas.charAt(2)) == false && Character.compare(':',cas.charAt(2)) != 0){
                    return null;
                }
                
                if(cas.length() >= 4 &&(Character.isDigit(cas.charAt(3)) == false )){
                    return null;
                }
                
                if(cas.length() == 5 &&(Character.isDigit(cas.charAt(4)) == false )){
                    return null;
                }
                
                String[] casy = cas.split(":");
                if(casy.length != 2){
                    return null;
                }
                
                hodinaInt = Integer.parseInt(casy[0]);
                minutaInt = Integer.parseInt(casy[1]);
                
                if(hodinaInt < 0 || hodinaInt > 23 || minutaInt < 0 || minutaInt > 59){
                    return null;
                }
                
                navrat = new Date(rokInt-1900, mesiacInt, denInt,hodinaInt, minutaInt,0);  
            }
            catch(NumberFormatException ex){
               // JOptionPane.showMessageDialog(this,"Zadali ste nespravny tvar čísla.");
		//this.repaint();
            }
            catch(Exception ex){
                ex.printStackTrace();
            }
            return navrat;
    }
       
}
